with Ada.Text_Io; use Ada.Text_Io;
with Ada.Integer_Text_Io; use Ada.Integer_Text_Io;

procedure Base is
   -- decl
   Nb : Integer ;
   Base : Integer range 2..10;
   Base2 : Integer range 2..10;

   -- function 10-> n base
   function DixtoN(Nb: Integer; Base : Integer ; Res : Integer ; P : Integer) return Integer is
   begin
      if Nb <=0 then
         return Res;
      else
         return DixtoN(Nb /Base , Base, Res+ (Nb rem Base)*(10 ** P),P+1);
      end if ;
   end DixtoN;


   --  function DixtoN (Nb: Integer ; Base : Integer) return Integer is
   --     N: Integer := Nb ;
   --     Res : Integer    ;
   --     Power : Integer = 0 ;
   --  begin
   --     while N>0 loop
   --        Res := Res + (N rem Base) * (10 ** P);
   --        P := P + 1;
   --        N := N/base;
   --     end loop
   --  end DixtoN;


   -- function n-> 10 base
   function Nto10 (Nb: Integer ; Base : Integer ; Res: Integer ; P: Integer ) return Integer is
   begin
      if Nb <=0 then
         return Res;
      else
         return Nto10(Nb/10,Base,Res + (Nb mod 10)*(Base ** P), P+1 );
      end if;
   end Nto10;
   -- function Nto10 (Nb : integer ; Base : integer) return integer is
   -- decl
   --  N : Integer := Nb;
   --  P : Integer :=0 ;
   --  Res :Integer := 0;
   --  begin
   --     while Nb >0 loop
   --        Res := Res + (N mod 10)*(Base ** P);
   --        N := N /10 ;
   --        P := P + 1 ;
   --     end loop;
   --     return Res;
   --  end Nto10;


begin
   Put_Line("Entrez un nombre");
   Put("> ");
   Get(Nb);
   Put_Line("Entrez la base d'entree entre 2 et 10");
   Put("> ");
   Get(Base);
   Put_Line("Entrez la base de sortie entre 2 et 10");
   Put("> ");
   Get(Base2);
   Put("le resultat de "&Integer'Image(Nb)&" en base "&Integer'Image(Base)&" vers la base "&Integer'Image(Base2)&" est "&Integer'Image(DixtoN(Nto10(Nb,Base,0,0),Base2,0,0)));


end Base;
